import traceback

from commons.assert_util import AssertUtil
from commons.extract_util import ExtractUtil
from commons.modle_util import verify_yaml, CaseInfo
from commons.request_util import RequestUtil, logger

eu = ExtractUtil()
ru = RequestUtil()
au = AssertUtil()

# 用例的标准化流程
def stand_case_flow(case_obj:CaseInfo):
    # 将请求参数写入日志
    logger.info(f"{str(case_obj.feature)} > {str(case_obj.title)} > {str(case_obj.story)}")

    # 使用提取的值:把${变量名}格式的值替换成具体的值
    new_request = eu.change(case_obj.request)
    # 发送请求
    res = ru.send_all_request(**new_request)
    # 如果有extract字段就提取请求响应的数据到extract.yaml文件中
    if case_obj.extract:
        for key, value in case_obj.extract.items():
            eu.extract(res, key, *value)  # *value直接解包获取三个值

    # 请求之后判断用例是否存在断言（validate不为none）
    try:
        if case_obj.validate:
            # 得用eu.change()解析交换之后再去判断：因为断言里面也可能有需要读取的值
            for asset_type, value in eu.change(case_obj.validate).items():
                au.assert_all_case(res, asset_type, value)
        # else:
        #     logger.info("此用例无断言\n")
    except Exception as e:
        logger.warning(f"断言失败{str(traceback.format_exc())}\n")
        raise e